package algo3.algothief.modelo;

import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class ObjetoRobado {
	
	private String nombre;
	
	private Pais paisDeOrigen;
	
	private CalidadDelObjeto calidad;
	private RangoPolicia rangoCaracteristico; // Es el RangoPolicia necesario para obtener cierta Calidad.
	
//-------------------------------------------------------------------------------------
	
	public ObjetoRobado(RangoNovato rango) {
		this.nombre = null;
		
		this.paisDeOrigen = null;
		
		this.calidad = new CalidadComun();
		this.rangoCaracteristico = rango;
	}
	
	public ObjetoRobado(RangoDetective rango) {
		this.nombre = null;
		
		this.paisDeOrigen = null;
		
		this.calidad = new CalidadComun();
		this.rangoCaracteristico = rango;
	}
	
	public ObjetoRobado(RangoInvestigador rango) {
		this.nombre = null;
		
		this.paisDeOrigen = null;
		
		this.calidad = new CalidadValioso();
		this.rangoCaracteristico = rango;
	}
	
	public ObjetoRobado(RangoSargento rango) {
		this.nombre = null;
		
		this.paisDeOrigen = null;
		
		this.calidad = new CalidadMuyValioso();
		this.rangoCaracteristico = rango;
	}
	
//-------------------------------------------------------------------------------------
	
	public Element serializar(Document doc) {
		Element elementoObjeto = doc.createElement("ObjetoRobado");
		
		Element elementoNombre = doc.createElement("NombreDelObjeto");
		elementoNombre.setAttribute("nombre", nombre);
		
		Element elementoPais = this.serializarPais(doc);
		Element elementoRango = rangoCaracteristico.serializar(doc, "CaracteristicoDelObjeto");
		
		elementoObjeto.appendChild(elementoNombre);
		elementoObjeto.appendChild(elementoPais);
		elementoObjeto.appendChild(elementoRango);
					
		return elementoObjeto;
	}
		
	public static ObjetoRobado hidratar(Document doc, ArrayList<Pais> paisesDelMundo) {
		Element elementoObjeto = (Element)doc.getElementsByTagName("ObjetoRobado").item(0);
		
		Element elementoNombre = (Element)elementoObjeto.getElementsByTagName("NombreDelObjeto").item(0);
		String nombreDelObjeto = elementoNombre.getAttribute("nombre");
		
		Pais paisDeOrigen = ObjetoRobado.hidratarPais(elementoObjeto, paisesDelMundo);
		
		RangoPolicia rango = RangoPolicia.hidratar(doc, "CaracteristicoDelObjeto");
		ObjetoRobado objetoNuevo = rango.definirObjetoQueSeRobara();
		objetoNuevo.definirNombreDelObjeto(nombreDelObjeto);
		objetoNuevo.definirPaisDeOrigen(paisDeOrigen);
		
		return objetoNuevo;
	}
	
//-------------------------------------------------------------------------------------	
	
	private Element serializarPais(Document doc) {
		Element elementoPais = doc.createElement("PaisOrigenDelObjeto");
		if (this.paisDeOrigen == null )
			elementoPais.setAttribute("nombreDeLaCapital", "");
		else
			elementoPais.setAttribute("nombreDeLaCapital", paisDeOrigen.verNombreDeLaCapital());
		
		return elementoPais;
	}
	
	
	
	private static int buscarIndiceEnPaisesDelPais(ArrayList<Pais> paises, String nombreDelPais) {
		int indiceDelPais = -1;
		int cantidadDePaises = paises.size();
		
		for (int i = 0; ( (indiceDelPais == -1) && (i < cantidadDePaises) ); i++) {
			String nombreDelPaisActual = paises.get(i).verNombreDeLaCapital();
			
			if (nombreDelPaisActual.matches(nombreDelPais)) 
				indiceDelPais = i;
		}
		
		return indiceDelPais;
	}
	
	private static Pais hidratarPais(Element elementoObjeto, ArrayList<Pais> paises) {
		Element elementoPais = (Element)elementoObjeto.getElementsByTagName("PaisOrigenDelObjeto").item(0);
		String nombreDeLaCapital = elementoPais.getAttribute("nombreDeLaCapital");
		
		if (nombreDeLaCapital.matches("")) 
			return null;
		
		int indiceDelPaisDelMismoNombre = ObjetoRobado.buscarIndiceEnPaisesDelPais(paises, nombreDeLaCapital);
		Pais pais = paises.get(indiceDelPaisDelMismoNombre);
		
		return pais;
	}
	
	private void definirNombreDelObjeto(String nombreDelObjeto) {
		this.nombre = nombreDelObjeto;
	}

//-------------------------------------------------------------------------------------	

	public void definirNombreDelObjeto(Pais pais) {
		String nombreDelObjeto = calidad.obtenerNombreParaUnObjetoARobar(pais);
		this.nombre = nombreDelObjeto;
	}
	
	public void definirPaisDeOrigen(Pais pais) {
		this.paisDeOrigen = pais;
	}
	
	
	public String verNombre() {
		return this.nombre;
	}
	
	public Pais verPaisDeOrigen() {
		return this.paisDeOrigen;
	}
	
	
	public int verLaCantidadDePaisesAVisitarPorElLadron() {
		return calidad.verLaCantidadDePaisesAVisitar();
	}
}
